package com.ash.socketb.dual;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 这个是一个双向通信的例子，典型的request-response机制
 * <p>
 * https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q1
 * <p>
 * 如何告知对方已发送完命令
 * 通过Socket关闭
 * 通过Socket关闭输出流的方式
 * 通过约定符号
 * 通过指定长度
 */
public class ClientDualDemo {

    public static void main(String[] args) throws IOException {


        System.out.println(sendReq("localhost", 8081, "asdf12asdfasdf"));
        System.out.println(sendReq("localhost", 8081, "112"));

    }

    /**
     * 这个方法有一个问题就是访问 频率比较的时候，每次都要建立一个新的连接，影响性能
     *
     * @param host
     * @param port
     * @param requestBody
     * @return
     * @throws IOException
     */
    private static String sendReq(String host, int port, String requestBody) throws IOException {
        try (
                Socket socket = new Socket(host, port);
                OutputStream outputStream = socket.getOutputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()))
        ) {

            outputStream.write(requestBody.getBytes(StandardCharsets.UTF_8));

            //通过shutdownOutput告诉服务器已经发送完数据，后续只能接受数据, 不写这一个，会导致阻塞,这里踩过坑
            socket.shutdownOutput();

            StringBuilder response = new StringBuilder();
            String line = null;
            while ((line = bufferedReader.readLine()) != null) {
                response.append(line);
            }

            return response.toString();
        }
    }
}
